﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ModelUML
{
    [Serializable]
    public class AsocjacjaUML : ElementUML
    {
        public override List<string> Validate()
        {
            List<String> lista = new List<string>();
            if (Count == 2)
            {
                if (konce[0].OwnedEnd.JestAktorem && konce[1].OwnedEnd.JestAktorem)
                    lista.Add("Połączono dwóch aktorów asocjacją");
                if (!konce[0].OwnedEnd.JestInterfejsem && konce[1].OwnedEnd.JestInterfejsem)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("interfejs \"{0}\" nie może dziedziczyć po {1} \"{2}\"", konce[1].OwnedEnd.Nazwa, konce[0].OwnedEnd.GetType().ToString(), konce[0].OwnedEnd.Nazwa));
                }
                if (!konce[1].OwnedEnd.JestInterfejsem && konce[0].OwnedEnd.JestInterfejsem)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("interfejs \"{0}\" nie może dziedziczyć po {1} \"{2}\"", konce[0].OwnedEnd.Nazwa, konce[1].OwnedEnd.GetType().ToString(), konce[1].OwnedEnd.Nazwa));
                }
                if ((!konce[0].OwnedEnd.JestKlasa || !konce[0].OwnedEnd.JestInterfejsem) && konce[1].OwnedEnd.JestKlasa)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("klasa \"{0}\" nie może dziedziczyć po {1} \"{2}\"", konce[1].OwnedEnd.Nazwa, konce[0].OwnedEnd.GetType().ToString(), konce[0].OwnedEnd.Nazwa));
                }
                if ((!konce[1].OwnedEnd.JestKlasa || !konce[1].OwnedEnd.JestInterfejsem) && konce[0].OwnedEnd.JestKlasa)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("klasa \"{0}\" nie może dziedziczyć po {1} \"{2}\"", konce[0].OwnedEnd.Nazwa, konce[1].OwnedEnd.GetType().ToString(), konce[1].OwnedEnd.Nazwa));
                }
                if (konce[0].OwnedEnd.JestKlasa && konce[1].OwnedEnd.JestKlasa)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja && konce[1].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("klasy: {0} i {1} nie mogą wzajemnie po sobie dziedziczyć", konce[0].OwnedEnd.Nazwa, konce[1].OwnedEnd.Nazwa));
                }
                if (konce[0].OwnedEnd.JestInterfejsem && konce[1].OwnedEnd.JestInterfejsem)
                {
                    if (konce[0].EndType == EndTypeEnum.generalizacja && konce[1].EndType == EndTypeEnum.generalizacja)
                        lista.Add(String.Format("interfejsy: {0} i {1} nie mogą wzajemnie po sobie dziedziczyć", konce[0].OwnedEnd.Nazwa, konce[1].OwnedEnd.Nazwa));
                }
            }

            return lista;
        }
        private String tekst=null;
        public String Tekst
        {
            get
            {
                if (tekst != null) return tekst;
                else return "";
            }
            set
            {
                tekst = value;
            }
        }
        
        [Serializable]
        public enum EndTypeEnum
        {
            brak, kompozycja, agregacja, generalizacja
        }
        [Serializable]
        public class KoncowkaAsocjacji
        {
            String teskst = null;
            String multiplikator = null;
            public String Tekst
            {
                get
                {
                    if (teskst != null) return teskst;
                    else return "";
                }
                set
                {
                    teskst = value;
                }
            }
            public String Multiplikator
            {
                get
                {
                    if (multiplikator != null) return multiplikator;
                    else return "";
                }
                set
                {
                    multiplikator = value;
                }
            }

            EndTypeEnum endType;
            public EndTypeEnum EndType
            {
                get
                {
                    return endType;
                }
                set
                {
                    endType = value;
                }
            }
            ElementUML ownedEnd;
            public ElementUML OwnedEnd
            {
                get
                {
                    return ownedEnd;
                }                
            }
            internal KoncowkaAsocjacji(ElementUML ownedEnd, EndTypeEnum endType)
            {
                this.ownedEnd = ownedEnd;
                this.endType = endType;
            }
        }
        public List<KoncowkaAsocjacji> konce;
        public int Count
        {
            get
            {
                return konce.Count;
            }            
        }
        public AsocjacjaUML()
        {
            konce = new List<KoncowkaAsocjacji>();
        }
        public KoncowkaAsocjacji this [int index] {
            get
            {
                return konce[index];
            }
        }
        public KoncowkaAsocjacji DodajZakonczenie(ElementUML element, EndTypeEnum endType) {
            KoncowkaAsocjacji k = new KoncowkaAsocjacji(element, endType);
            konce.Add(k);
            return k;
        }
        public KoncowkaAsocjacji DodajZakonczenie(ElementUML element)
        {
            Console.WriteLine("Dodaje zakonczenie: " + element);
            KoncowkaAsocjacji k = new KoncowkaAsocjacji(element, EndTypeEnum.brak);
            konce.Add(k);
            return k;
        }
    }
}
